package com.cskaoyan.javase.array._5operation._0traverse;

/**
 * 数组的遍历（traverse）是最最基本的操作，是进行数组中其它操作的基础。
 * 它的含义是依次访问（或输出）数组中的每一个元素。
 *
 * 这里我们先手写一下数组遍历的实现.
 *
 * @since 17:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        // i就当成数组下标去使用,使用for循环遍历数组,实际上是遍历数组的下标
        /*for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }*/
        // for循环遍历数组的快捷键 数组名.fori
        // 提取一段代码,作为一个新的方法 快捷键 alt + ctrl + m
        // arr = new int[0];
        arr = null;
        traverse8(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    // 需求1: 改进以上遍历打印元素的格式,希望的格式如下: [1, 2, 3]
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 以上方法可以实现"[1, 2, 3, ]",接下来需要改进去掉最后一个元素的", "怎么解决呢?
    /*
        解决方案:
            1.最简单是加两个退格
            2.if判断,当是最后一个元素的时候,不要加", "
     */
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        // 退格解决
        System.out.println("\b\b]");
    }

    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            // if判断解决
            if (i == arr.length - 1) {
                // 最后一个元素
                System.out.print(arr[i]);
                // 已经打印完最后一个元素了,直接结束循环即可
                break;
                // return;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }


    // 需求2: 希望这个遍历的方法,允许传入长度为0的数组,并且输出:"您输入的数组长度为0,请重新输入!"
    /*
        在判断数组长度的时候
        可以判断==0,当然也可以判断!=0
        那么以上两种方式,哪一个好,还是随便?
        应该是写"==0"好
        这样就可以减少大括号的嵌套
        在实际开发中,在写if判断语句时
            应该让尽量少,尽量简单的代码,放在if的大括号里
            如果有得选的话
     */
    public static void traverse5(int[] arr) {
        if (arr.length == 0) {
            //数组长度是0,给出友好的提示
            System.out.println("您输入的数组长度为0,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        // 退格解决
        System.out.println("\b\b]");
    }

    public static void traverse6(int[] arr) {
        if (arr.length != 0) {
            // 长度不为0,正常进行遍历
            System.out.print("[");
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + ", ");
            }
            // 退格解决
            System.out.println("\b\b]");
            return;
        }
        //数组长度是0,给出友好的提示
        System.out.println("您输入的数组长度为0,请重新输入!");
    }

    // 需求3: 使得方法能够接收null数组的输入,并且给出友好的提示: "您输入的数组长度是一个null,请重新输入!"
    public static void traverse7(int[] arr) {
        // 先判断null,再判断长度为0
        if (arr == null) {
            System.out.println("您输入的数组长度是一个null,请重新输入!");
            return;
        }
        if (arr.length == 0) {
            //数组长度是0,给出友好的提示
            System.out.println("您输入的数组长度为0,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        // 退格解决
        System.out.println("\b\b]");
    }

    // 需求4: 同时处理长度为0和null数组,把它们都归结成不正常的数据输入,给出提升:"您输入的数组不正常,请重新输入!"
    public static void traverse8(int[] arr) {
        // 同时判断null和数组长度为0
        // 同时判断两个条件,需要逻辑运算符
        if (arr == null || arr.length == 0) {
            System.out.println("您输入的数组不正常,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        // 退格解决
        System.out.println("\b\b]");
    }

}
